昨天簡單介紹完Service的背後元件kube-proxy的運作原理,今天要來看看Service的類型以及背後原理有什麼不一樣
大概長這樣,type有四種可以自己填。
apiVersion: v1
kind: Service
metadata:
name: my-nginx-service
spec:
type: NodePort
ports:
- nodePort: 30888
port: 80
targetPort: 80
selector:
app: nginx1-7
在Service deployment裡面可以找到一個叫做Selector的標籤, 根據官網文件,K8s會掃描所有Pods, 並指派一個VIP(Virtual IP),指到跟這個Selector名字匹配的Pods。
那如果不加Selector呢?
根據官方文件在以下兩種情況, 你會選擇不使用Selector去指定你要的Pods:
如果不使用Selector, 就必須自己指定IP + port,建立endpoint resource object, 但有幾點注意事項在官方文件上,這邊就不贅述了。
Service 總共有四種 types:
預設的type, 沒有在service的yaml檔宣告任何type的話, K8s會給透過kube-proxy該service一組cluster IP, 這個ip只有在cluster裡面才能ping的到。
如果cluster IP沒辦法被ping到,就要檢查看看是不是endpoint沒有被設定
這種就是沒有被設定endpoint的service,原因是因為對應不到後面的pods。
一個或一堆pods在運行的時候,K8s其中的一個components Kubelet會啟動兩種probes(探針)來偵測pods是否運行正常:
而只有 readinessProbe 檢查通過的Pods, 才會出現在Endpoints列表。所以這個Pods如果被users砍掉或是啟動失敗, services就會對應不到Pods。
簡單來說,就是在主機的iptables加開port, 讓服務可以透過這個port來serve request。
假設我們的cluster裡面已經有了一個nginx的deployment,就寫一個service yaml file, 記得selector要和該deployment的labels符合。
my-nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
*這邊也可以指定nodePort e.g: nodePort: 30888*
selector:
app: nginx1-7
這份yaml file的意思是說我要將nginx1-7這個deployment指到的pods裡面container的port 80開出來給人連線,並且這個service名字就叫做my-nginx-service。
如果nodePort沒有被指定的話, K8s就會隨機分配30000 ~ 32767的ports給你, 這個預設範圍可以透過修改kube-apiserver這個參數去修改。
kubectl apply my-nginx-service.yaml
結果:
ssh into node檢查
我是用AWS instance,修改security groups的inbound rule之後就可以透過外部access
明天再介紹剩下兩個類型。